package com.automapper.repository;

import java.util.List;

import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import com.automapper.query.Criteria;

@Repository
public interface AutoMapperRepository {
	
	/**
	 * 保存对象（不支持Map对象）
	 * @param obj
	 */
	public void insert(@Param("autoMapperParam") Object obj);
	
	/**
	 * 保存对象<br>
	 * 表名会优先使用入参tableName, 当tableName为空或空字符串，将会使用对象@Table注解的name值
	 * @param obj
	 * @param tableName 表名
	 */
	public void insert(@Param("autoMapperParam") Object obj, @Param("tableName") String tableName);
	
	/**
	 * 保存对象<br>
	 * 表名会优先使用入参tableName, 当tableName为空或空字符串，将会使用对象@Table注解的name值
	 * @param obj
	 * @param tableName 表名
	 * @param excludeCol 排查入库字段（对象@Column.name的值）
	 */
	public void insert(@Param("autoMapperParam") Object obj, @Param("tableName") String tableName, @Param("excludeCol") List<String> excludeCol);
	
	/**
	 * 更新操作（不支持Map和List<Map>对象）
	 * @param obj
	 */
	public void update(@Param("autoMapperParam") Object obj);
	
	/**
	 * 更新操作（不支持Map，List对象）<br>
	 * 表名会优先使用入参tableName, 当tableName为空或空字符串，将会使用对象@Table注解的name值
	 * @param obj
	 * @param tableName 表名
	 */
	public void update(@Param("autoMapperParam") Object obj, @Param("tableName") String tableName);
	
	/**
	 * 更新操作（不支持Map，List对象）<br>
	 * 表名会优先使用入参tableName, 当tableName为空或空字符串，将会使用对象@Table注解的name值
	 * @param obj
	 * @param tableName 表名
	 * @param excludeCol 排查更新字段（对象@Column.name的值）
	 */
	public void update(@Param("autoMapperParam") Object obj, @Param("tableName") String tableName, @Param("excludeCol") List<String> excludeCol);
	
	/**
	 * 根据对象@Id注解删除数据（不支持Map对象）
	 * @param obj
	 */
	public void delete(@Param("autoMapperParam") Object obj);
	
	/**
	 * 根据对象@Id注解删除数据（不支持Map对象）<br>
	 * 表名会优先使用入场tableName, 当tableName为空或空字符串，将会使用对象@Table注解的name值
	 * @param obj
	 * @param tableName 表名
	 */
	public void delete(@Param("autoMapperParam") Object obj, @Param("tableName") String tableName);
	
	/**
	 * 保存对象（不支持Map对象）<br>
	 * 并将生成的主键赋值给@Id的属性
	 * @param obj
	 */
	public void persistent(@Param("autoMapperParam") Object obj);
	
	/**
	 * 保存对象（不支持Map对象）<br>
	 * 并将生成的主键赋值给@Id的属性
	 * 表名会优先使用入场tableName, 当tableName为空或空字符串，将会使用对象@Table注解的name值
	 * @param obj
	 * @param tableName 表名
	 */
	public void persistent(@Param("autoMapperParam") Object obj, @Param("tableName") String tableName);
	
	/**
	 * 保存对象（不支持Map对象）<br>
	 * 并将生成的主键赋值给@Id的属性<br>
	 * 表名会优先使用入场tableName, 当tableName为空或空字符串，将会使用对象@Table注解的name值
	 * @param obj
	 * @param tableName 表名
	 * @param excludeCol 排查更新字段（对象@Column.name的值）
	 */
	public void persistent(@Param("autoMapperParam") Object obj, @Param("tableName") String tableName, @Param("excludeCol") List<String> excludeCol);
	
	/**
	 * 查询方法
	 * @param query
	 * @return
	 */
	public <T> List<T> select(@Param("autoMapperParam") Criteria criteria);
}
